import { getFormatDate, types, isEmptyParam } from '@/utils/utils';
import { StateType } from '@/common-typings';

/**
 * 对表单内对默认数据进行组装
 * @param props
 * @param onlyHidden 塞选出配置项中hidden=true的value
 */
export const assignDefaultFormData = (props: StateType, onlyHidden = false) => {
  const { formConfig } = props;
  const result = {};

  const getResult = (res: StateType, id: string, item: StateType) => {
    const format = (value: any) => {
      if (item.options.hasOwnProperty('format') && types(item.options.format) === 'function') {
        return item.options.format(item.options.value);
      }
      return value;
    };
    // 塞选出配置项中hidden=true的value
    if (onlyHidden && item.options.hidden) {
      res[id] = format(item.options.value);
    } else if (!onlyHidden) {
      res[id] = format(item.options.value);
    }
  };

  if (formConfig && formConfig.config) {
    formConfig.config.map((item: StateType) => {
      if (item.options.hasOwnProperty('value')) {
        if (types(item.options.value) === 'array') {
          if (item.options.value.length) {
            // 此处主要考虑日期组件到处理
            if (item.options.hasOwnProperty('format') && item.type === 'daterange') {
              const getDateTime = () => {
                // timeStamp 格式化为时间戳
                // showTime 格式化到秒
                const { format, timeStamp, value, showTime } = item.options;
                // if (onlyHidden)
                if (timeStamp) {
                  result[format['0']] = value['0'].valueOf();
                  result[format['1']] = value['1'].valueOf();
                } else {
                  result[format['0']] = getFormatDate(value['0'], !!showTime);
                  result[format['1']] = getFormatDate(value['1'], !!showTime);
                }
              };
              if (onlyHidden && item.options.hidden) {
                getDateTime();
              } else if (!onlyHidden) {
                getDateTime();
              }
            } else {
              getResult(result, item.id, item);
            }
          }
        } else if (!isEmptyParam(item.options.value) && item.options.value !== '|') {
          getResult(result, item.id, item);
        }
      }
      return item;
    });
  }
  return result;
};

/**
 * 过滤点击表单时的数据
 * @param value
 * @param formConfig
 */
export const filterFormData = (value: StateType, formConfig: StateType) => {
  Object.keys(value).map(valueKey => {
    const currentItem = formConfig.config.filter((i: any) => i.id === valueKey)[0];
    const hasFormat = currentItem && currentItem.options.format;

    // 清除去"|"的默认值, 该字符主要用于select的全部，当后台默认返回全部时，使用该字符
    if (types(value[valueKey]) === 'string' && value[valueKey].indexOf('|') > -1) {
      delete value[valueKey];
    }

    // 当传递当参数为array类型时
    if (types(value[valueKey]) === 'array') {
      // 当其中没有参数时，删除key
      if (!value[valueKey].length) {
        delete value[valueKey];

        // 此处主要考虑日期组件到处理
      } else if (hasFormat) {
        if (currentItem.type === 'daterange') {
          // timeStamp 格式化为时间戳
          // showTime 格式化到秒
          const { format, timeStamp, showTime } = currentItem.options;
          if (timeStamp) {
            value[format['0']] = value[valueKey]['0'].valueOf();
            value[format['1']] = value[valueKey]['1'].valueOf();
          } else {
            value[format['0']] = getFormatDate(value[valueKey]['0'], !!showTime);
            value[format['1']] = getFormatDate(value[valueKey]['1'], !!showTime);
          }
          // 日期转化后，清楚当前key
          delete value[valueKey];
        } else if (
          !isEmptyParam(value[valueKey]) &&
          types(currentItem.options.format) === 'function'
        ) {
          value[valueKey] = currentItem.options.format(value[valueKey]);
        }
      }
    } else if (
      hasFormat &&
      !isEmptyParam(value[valueKey]) &&
      types(currentItem.options.format) === 'function'
    ) {
      value[valueKey] = currentItem.options.format(value[valueKey]);
    }
    // 清理参数中，空字符串或者null，undefined
    if (isEmptyParam(value[valueKey])) {
      delete value[valueKey];
    }
    return valueKey;
  });
};
